package com.example.blogServer.utils;

import ch.qos.logback.core.net.server.Client;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.boot.web.reactive.context.ReactiveWebApplicationContext;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

/**
 * 设置两个方法,一个生成密钥,一个解释密钥
 * @author Spark
 * @version 1.0
 */
public class jwtUtils {

    /**
     * 生成一个JWT令牌需要以下信息
     * @param secretKey  加密密钥用于生成signature部分
     * @param ttlMillis  定义过期时间,注意时间戳是一个long整形
     * @param claims     用于定义payload部分,一般是可以唯一标识用户但不敏感的用户信息userId
     *                   JWT头部header比较固定,是签名算法和令牌类型(JWT),通过配置jjwt提供的枚举类指定
     * @return
     */
    public static String creatJwt(String secretKey, long ttlMillis, Map<String, Object> claims){

        //指定加密算法,也就是Header部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        //设置过期时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        //设置jwt的payload和signature部分,并加入过期时间的相关配置
        JwtBuilder jwtBuilder = Jwts.builder()
                .addClaims(claims)
                .signWith(signatureAlgorithm,secretKey.getBytes(StandardCharsets.UTF_8))
                .setExpiration(exp);

        return jwtBuilder.compact();
    }

    /**
     * 解析jwt,需要密钥和token
     * @param secretKey
     * @param token
     * @return
     */
    public static Claims parseJwt(String secretKey , String token){
        //解析jwt时的固定写法
       Claims claims = Jwts.parser()
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                .parseClaimsJws(token)
                .getBody();

        return claims;
    }



}
